//
//  CQUserAccount.swift
//  swift-weibo
//
//  Created by 陈乾 on 15/10/28.
//  Copyright © 2015年 陈乾. All rights reserved.
//

import UIKit

class CQUserAccount: NSObject,NSCoding{
    
    //判断是个登录的属性
    //有账号就返回YES
   class var loginYN: Bool {
        get{
         return CQUserAccount.loadAccount() != nil
        }
    
    }
    /// 用于调用access_token，接口获取授权后的access token
    var access_token: String?
    /// 存储型属性 有效时间
    var expires_in: NSTimeInterval = 0 {
        didSet {
            expires_date = NSDate(timeIntervalSinceNow: expires_in)
        }
    }
    /// 当前授权用户的UID
    var uid: String?
    
    /// 友好显示名称
    var name: String?
    
    /// 户头像地址（大图），180×180像
    var avatar_large: String?
    
    /// 有效的时间NSDate形式
    var expires_date: NSDate?
    
    //MARK: -重写init字典转模型
    init(dic: [String: AnyObject]) {
        
        super.init()
        //kvc字典转模型
        setValuesForKeysWithDictionary(dic)
        
    }
    
    //实现这个方法什么也不做 有key没有值 也不会出错
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
   
    //重写打印的方法
    override var description: String {
        
        return ("access_token:\(access_token),expires_in:\(expires_in),uid:\(uid),expires_date:\(expires_date),avatar_large:\(avatar_large),name:\(name)")
        
    }
    
    
    //MARK: - 加载用户数据 --用户名 用户头像
    func loadUserInfo(finished: (error: NSError?) -> ())
    {
       CQNetworkTool.shareInstance.loadUserInfo { (result, error) -> () in
        
        //回调没有结果
        if result == nil || error != nil {
          //告诉用户请求数据失败 用一个闭包
            finished(error: error!)
            print("请求数据失败")
            return
        
        }
        //来这 说明有结果了
        //1.给模型复制
     self.name = result!["name"] as? String
     self.avatar_large = result!["avatar_large"] as? String
        //调用保存函数
        self.save()
        //同步内存的属性
        CQUserAccount.userAccount = self
        finished(error: nil)

        
        }
    
    
    }
    
    //MARK: - 保存函数
    static let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,  NSSearchPathDomainMask.UserDomainMask, true).last! + "/account.plist"
    func save() {
        
        NSKeyedArchiver.archiveRootObject(self, toFile:CQUserAccount.path)
        
        
    }

    //为了降低空间复杂度 我们没必要每次都去网上加载UserAccount 所以我们定义一个变量 保存在内存
    private static var userAccount: CQUserAccount?
    //MARK: - 沙盒读取
    class func loadAccount() -> CQUserAccount?{
        
        //内存没有数据 我们就去沙盒取
        if userAccount == nil
        {
            
            userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? CQUserAccount
        }
        
        //数据可能为空 有效期 可能失效 所以要判断
        if userAccount != nil && userAccount?.expires_date?.compare(NSDate()) == NSComparisonResult.OrderedDescending
        {
        //来这里数据有效
        return userAccount
        }
        //来这来没有数据
        return nil
        
    }
    
    //vtes
    //MARK: - 归
    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(access_token, forKey: "access_token")
        aCoder.encodeObject(uid, forKey: "uid")
        aCoder.encodeObject(expires_date, forKey: "expires_date")
        aCoder.encodeDouble(expires_in, forKey: "expires_in")
        
        aCoder.encodeObject(avatar_large, forKey: "avatar_large")
        aCoder.encodeObject(name, forKey: "name")

        
    }
    //MARK: - 解档
    required init?(coder aDecoder: NSCoder) {
     super.init()
        access_token = aDecoder.decodeObjectForKey("access_token") as? String
        uid = aDecoder.decodeObjectForKey("uid") as? String
        expires_date = aDecoder.decodeObjectForKey("expires_date") as? NSDate
        expires_in = aDecoder.decodeDoubleForKey("expires_in")
        
        avatar_large = aDecoder.decodeObjectForKey("avatar_large") as? String
        name = aDecoder.decodeObjectForKey("name") as? String

        
        
    }
    
    
/**End**/
}
